package com.rp.dao.local;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.rp.dao.IEstabelecimentoDAO;
import com.rp.dao.ResultSetProcessor;
import com.rp.model.Estabelecimento;
import com.rp.model.Produto;

public class EstabelecimentoLDAO implements IEstabelecimentoDAO {
    private Context context;

    public EstabelecimentoLDAO(Context context) {
	this.context = context;
    }

    private static final String DB_NAME = "DB_RP";

    public void criarTabela1() throws Throwable {
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    BancoDados
		    .execSQL("CREATE TABLE IF NOT EXISTS estabelecimento ("
			    + "nome TEXT, cnpj INTEGER, latitude INTEGER, longitude INTEGER, endereco TEXT, data_alteracao INTEGER);");
	} finally {
	    BancoDados.close();
	}
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IEstabelecimentoDAO#buscarEstabelecimentos()
     */
    @Override
    public List<String> buscarEstabelecimentos() throws Throwable {
	List<String> nomes = new ArrayList<String>();
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT nome FROM estabelecimento;", null);
	    try {
		while (cursor.moveToNext()) {
		    String nome = cursor.getString(0);
		    nomes.add(nome);
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return nomes;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.rp.dao.local.IEstabelecimentoDAO#insereEstabelecimento(com.rp.model
     * .Estabelecimento)
     */
    @Override
    public void insereEstabelecimento(Estabelecimento estabelecimento)
	    throws Throwable {
	String nome = estabelecimento.getNome();
	long cnpj = estabelecimento.getCnpj();
	long latitude = estabelecimento.getLatitude();
	long longitude = estabelecimento.getLongitude();
	String endereco = estabelecimento.getEndereco();
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    BancoDados
		    .execSQL("INSERT INTO estabelecimento (nome,cnpj,latitude,longitude,endereco) VALUES('"
			    + nome
			    + "',"
			    + cnpj
			    + ","
			    + latitude
			    + ","
			    + longitude + ",'" + endereco + "');");
	} finally {
	    BancoDados.close();
	}
    }

    @Override
    public void atualizaEstabelecimento(Estabelecimento estabelecimento)
	    throws Throwable {
	String nome = estabelecimento.getNome();
	long cnpj = estabelecimento.getCnpj();
	long latitude = estabelecimento.getLatitude();
	long longitude = estabelecimento.getLongitude();
	String endereco = estabelecimento.getEndereco();
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    BancoDados.execSQL("UPDATE estabelecimento SET nome = '" + nome
		    + "', latitude = " + latitude + ", longitude = "
		    + longitude + ", endereco = '" + endereco
		    + "' WHERE cnpj = " + cnpj);
	} finally {
	    BancoDados.close();
	}
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IEstabelecimentoDAO#buscarPorNome(java.lang.String)
     */
    @Override
    public long buscarCnpjPorNome(String nome) throws Throwable {
	Produto p = null;
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT cnpj FROM estabelecimento WHERE nome = '" + nome
			    + "';", null);
	    try {
		if (cursor.moveToNext()) {
		    long cnpj = cursor.getLong(0);
		    return cnpj;
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return -1;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.rp.dao.local.IEstabelecimentoDAO#buscarPeloCnpj(java.lang.String)
     */
    @Override
    public Estabelecimento buscarPeloCnpj(long cnpj) throws Throwable {
	Produto p = null;
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT nome,cnpj,endereco FROM estabelecimento WHERE cnpj = "
			    + cnpj + ";", null);
	    try {
		if (cursor.moveToNext()) {
		    String nome = cursor.getString(0);
		    cnpj = cursor.getInt(1);
		    String endereco = cursor.getString(2);
		    long data = cursor.getLong(3);
		    return new Estabelecimento(nome, cnpj, endereco, 0, 0, data);
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return null;
    }

    public long count(Calendar data) throws Throwable {
	Produto p = null;
	SQLiteDatabase BancoDados = null;
	try {
	    BancoDados = context.openOrCreateDatabase(DB_NAME,
		    Context.MODE_WORLD_READABLE, null);
	    Cursor cursor = BancoDados.rawQuery(
		    "SELECT count(*) FROM estabelecimento where data_alteracao > "
			    + data.getTimeInMillis() + ";", null);
	    try {
		if (cursor.moveToNext()) {
		    long count = cursor.getInt(0);
		    return count;
		}
	    } finally {
		cursor.close();
	    }
	} finally {
	    BancoDados.close();
	}
	return 0;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.rp.dao.local.IEstabelecimentoDAO#getPendentesEnviar()
     */
    @Override
    public ResultSetProcessor<Estabelecimento> getPendentes(Calendar data)
	    throws Throwable {
	Produto p = null;
	final SQLiteDatabase BancoDados = context.openOrCreateDatabase(DB_NAME,
		Context.MODE_WORLD_READABLE, null);
	final Cursor cursor = BancoDados.rawQuery(
		"SELECT nome,cnpj,endereco FROM estabelecimento where data_alteracao > "
			+ data.getTimeInMillis() + ";", null);
	return new ResultSetProcessor<Estabelecimento>() {
	    @Override
	    public Estabelecimento process() throws Throwable {
		Estabelecimento estabelecimento = null;
		if (cursor.moveToNext()) {
		    String nome = cursor.getString(0);
		    long cnpj = cursor.getInt(1);
		    String endereco = cursor.getString(2);
		    long data = cursor.getLong(3);
		    estabelecimento = new Estabelecimento(nome, cnpj, endereco,
			    0, 0, data);
		} else {
		    cursor.close();
		    BancoDados.close();
		}
		return estabelecimento;
	    }
	};
    }
}
